#!/bin/bash

# OpenHarmony Build Manager (bl) - 安装脚本

set -e

GREEN='\033[0;32m'
BLUE='\033[0;34m'
YELLOW='\033[1;33m'
RED='\033[0;31m'
NC='\033[0m'

echo -e "${BLUE}========================================${NC}"
echo -e "${BLUE}OpenHarmony Build Manager (bl) 安装程序${NC}"
echo -e "${BLUE}========================================${NC}"
echo ""

# 检查用户 bin 目录
USER_BIN="$HOME/bin"
if [ ! -d "$USER_BIN" ]; then
    echo -e "${YELLOW}创建用户 bin 目录: $USER_BIN${NC}"
    mkdir -p "$USER_BIN"
fi

# 查找 bl.sh 脚本文件
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
SOURCE_SCRIPT=""

# 按优先级查找脚本文件
for name in "bl.sh" "build_code.sh"; do
    if [ -f "$SCRIPT_DIR/$name" ]; then
        SOURCE_SCRIPT="$SCRIPT_DIR/$name"
        echo -e "${GREEN}✓ 找到脚本: $name${NC}"
        break
    fi
done

if [ -z "$SOURCE_SCRIPT" ]; then
    echo -e "${RED}✗ 错误: 未找到 bl.sh 脚本文件${NC}"
    echo ""
    echo "请确保以下文件之一存在于当前目录:"
    echo "  - bl.sh"
    echo "  - build_code.sh"
    exit 1
fi

# 复制并重命名脚本
BL_SCRIPT="$USER_BIN/bl"
echo -e "${BLUE}安装 bl 到: $BL_SCRIPT${NC}"
cp "$SOURCE_SCRIPT" "$BL_SCRIPT"

# 添加执行权限
chmod +x "$BL_SCRIPT"
echo -e "${GREEN}✓ 已添加执行权限${NC}"

echo ""
echo -e "${GREEN}========================================${NC}"
echo -e "${GREEN}✓ 安装完成！${NC}"
echo -e "${GREEN}========================================${NC}"
echo ""

# 检查 PATH
if [[ ":$PATH:" != *":$USER_BIN:"* ]]; then
    echo -e "${YELLOW}⚠ 注意: $USER_BIN 不在 PATH 中${NC}"
    echo ""
    echo "请根据你的 shell 执行以下操作:"
    echo ""
    echo -e "${BLUE}对于 Bash:${NC}"
    echo "  echo 'export PATH=\"\$HOME/bin:\$PATH\"' >> ~/.bashrc"
    echo "  source ~/.bashrc"
    echo ""
    echo -e "${BLUE}对于 Zsh:${NC}"
    echo "  echo 'export PATH=\"\$HOME/bin:\$PATH\"' >> ~/.zshrc"
    echo "  source ~/.zshrc"
    echo ""
else
    echo -e "${GREEN}✓ PATH 已正确配置${NC}"
    echo ""
fi

echo "现在你可以使用以下命令:"
echo ""
echo -e "  ${BLUE}bl --help${NC}    # 查看帮助"
echo -e "  ${BLUE}bl status${NC}    # 查看状态"
echo -e "  ${BLUE}bl download${NC}  # 下载代码"
echo -e "  ${BLUE}bl list${NC}      # 选择版本"
echo -e "  ${BLUE}bl build${NC}     # 编译代码"
echo ""

# 自动配置多分支
echo -e "${YELLOW}========================================${NC}"
echo -e "${YELLOW}自动配置多分支${NC}"
echo -e "${YELLOW}========================================${NC}"
echo ""

# 初始化分支配置文件
BRANCHES_CONFIG="$HOME/openharmony/.bl_branches"
mkdir -p "$HOME/openharmony"

# 检查是否已有分支配置
if [ -f "$BRANCHES_CONFIG" ] && grep -q "^# Branch:" "$BRANCHES_CONFIG"; then
    echo -e "${GREEN}✓ 发现已有分支配置，保留现有配置${NC}"
    echo "  现有分支:"
    grep "^# Branch:" "$BRANCHES_CONFIG" | sed 's/# Branch: /    • /'
    echo ""
else
    echo -e "${BLUE}正在创建默认分支配置 (trunk 和 dev)...${NC}"

    # 创建分支配置文件
    cat > "$BRANCHES_CONFIG" << 'EOF'
# OpenHarmony Branches Configuration
# 此文件由安装脚本自动生成

# Branch: trunk
BRANCH_trunk_REPO_CMD="repo init -u https://gitcode.com/openharmony/manifest.git -b master --no-repo-verify"
BRANCH_trunk_PREBUILTS_CMD="bash build/prebuilts_download.sh"
BRANCH_trunk_BUILD_CMD="./build.sh --product-name rk3568 --ccache --build-target graphic_2d"

# Branch: dev
BRANCH_dev_REPO_CMD="repo init -u https://gitcode.com/openharmony/manifest.git -b dev --no-repo-verify"
BRANCH_dev_PREBUILTS_CMD="bash build/prebuilts_download.sh"
BRANCH_dev_BUILD_CMD="./build.sh --product-name rk3568 --ccache --build-target graphic_2d"
EOF

    echo -e "${GREEN}✓ 已创建分支配置:${NC}"
    echo "  • trunk (master 分支)"
    echo "  • dev (dev 分支)"
fi

echo -e "${GREEN}✓ 分支配置位置: $BRANCHES_CONFIG${NC}"
echo ""

# 配置 repo 认证环境变量
echo -e "${YELLOW}========================================${NC}"
echo -e "${YELLOW}配置 Repo 认证环境变量${NC}"
echo -e "${YELLOW}========================================${NC}"
echo ""

REPO_ENV_FILE="$HOME/.repo_env"

# 函数：从 .bashrc 提取环境变量
extract_env_from_bashrc() {
    local bashrc="$HOME/.bashrc"
    if [ ! -f "$bashrc" ]; then
        return 1
    fi
    
    # 尝试提取 ONLINE_USERNAME 和 ONLINE_PASSWD
    # 使用临时 shell 来执行 .bashrc 中的所有内容（包括非交互式之前的部分）
    local temp_script=$(mktemp)
    
    # 从 .bashrc 中提取所有 export ONLINE_USERNAME 和 ONLINE_PASSWD 的行
    grep -E "^\s*(export\s+)?(ONLINE_USERNAME|ONLINE_PASSWD)=" "$bashrc" 2>/dev/null > "$temp_script" || true
    
    # 如果找到了配置
    if [ -s "$temp_script" ]; then
        # 确保有 export 关键字
        sed -i 's/^\s*ONLINE_USERNAME=/export ONLINE_USERNAME=/' "$temp_script"
        sed -i 's/^\s*ONLINE_PASSWD=/export ONLINE_PASSWD=/' "$temp_script"
        
        # 将内容写入 .repo_env
        cat > "$REPO_ENV_FILE" << 'HEADER'
# Repo 认证环境变量
# 此文件由安装脚本自动从 .bashrc 提取生成
# 用于解决非交互式 shell 环境变量加载问题

HEADER
        cat "$temp_script" >> "$REPO_ENV_FILE"
        rm -f "$temp_script"
        return 0
    fi
    
    rm -f "$temp_script"
    return 1
}

# 检查是否已存在 .repo_env
if [ -f "$REPO_ENV_FILE" ]; then
    echo -e "${YELLOW}⚠ 发现已存在的 $REPO_ENV_FILE${NC}"
    read -r -p "是否覆盖? (y/N): " response
    if [[ ! "$response" =~ ^[Yy]$ ]]; then
        echo -e "${GREEN}✓ 保留现有配置${NC}"
        echo ""
    else
        rm -f "$REPO_ENV_FILE"
    fi
fi

# 如果 .repo_env 不存在，尝试创建
if [ ! -f "$REPO_ENV_FILE" ]; then
    echo -e "${BLUE}正在检查 .bashrc 中的认证配置...${NC}"
    
    if extract_env_from_bashrc; then
        echo -e "${GREEN}✓ 已从 .bashrc 提取认证信息到 $REPO_ENV_FILE${NC}"
        echo -e "${GREEN}✓ 已自动解决非交互式 shell 环境变量问题${NC}"
    else
        # 创建模板文件
        cat > "$REPO_ENV_FILE" << 'EOF'
# Repo 认证环境变量
# 请填写您的 Gitcode/Gitee 认证信息

export ONLINE_USERNAME='your_username_here'
export ONLINE_PASSWD='your_password_here'

# 如果密码包含特殊字符，可以使用 printf %q 进行转义：
# export ONLINE_PASSWD="$(printf %q 'your_password_with_special_chars')"
EOF
        echo -e "${YELLOW}⚠ 未在 .bashrc 中找到认证配置${NC}"
        echo -e "${BLUE}✓ 已创建模板文件: $REPO_ENV_FILE${NC}"
        echo -e "${YELLOW}  请编辑此文件并填写您的认证信息${NC}"
        echo ""
        echo -e "${BLUE}编辑命令: nano $REPO_ENV_FILE${NC}"
    fi
    
    # 设置安全权限
    chmod 600 "$REPO_ENV_FILE"
    echo -e "${GREEN}✓ 已设置文件权限为 600 (仅所有者可读写)${NC}"
    echo ""
fi

# 自动添加定时任务
echo -e "${YELLOW}========================================${NC}"
echo -e "${YELLOW}自动配置定时任务${NC}"
echo -e "${YELLOW}========================================${NC}"
echo ""
echo -e "${BLUE}正在为分支添加定时任务...${NC}"

# 定义分支和时间
BRANCHES_TO_SETUP=("trunk" "dev")
CRON_TIMES=(0 2)  # trunk 在 0:00, dev 在 2:00

# 获取当前的 crontab
TEMP_CRON=$(mktemp)
crontab -l 2>/dev/null > "$TEMP_CRON" || true

# 确保 crontab 中有 PATH 设置（如果不存在则添加）
if ! grep -q "^PATH=" "$TEMP_CRON"; then
    # 在文件开头添加 PATH 和必要的环境变量
    TEMP_CRON_NEW=$(mktemp)
    echo "PATH=$HOME/bin:$HOME/.bin:$HOME/.local/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/sbin" > "$TEMP_CRON_NEW"
    echo "SHELL=/bin/bash" >> "$TEMP_CRON_NEW"
    echo "PYTHONIOENCODING=utf-8" >> "$TEMP_CRON_NEW"
    
    # 尝试找到 git 并设置环境变量（repo 工具需要）
    if command -v git >/dev/null 2>&1; then
        echo "GIT_PYTHON_GIT_EXECUTABLE=$(command -v git)" >> "$TEMP_CRON_NEW"
    fi
    
    echo "" >> "$TEMP_CRON_NEW"
    cat "$TEMP_CRON" >> "$TEMP_CRON_NEW"
    mv "$TEMP_CRON_NEW" "$TEMP_CRON"
    echo -e "${GREEN}✓ 已在 crontab 中添加 PATH 和必要的环境变量${NC}"
fi

# 为每个分支添加定时任务
for i in "${!BRANCHES_TO_SETUP[@]}"; do
    branch="${BRANCHES_TO_SETUP[$i]}"
    hour="${CRON_TIMES[$i]}"
    
    # 检查是否已存在该分支的定时任务
    if grep -q "$BL_SCRIPT $branch" "$TEMP_CRON"; then
        echo -e "${YELLOW}⚠ 分支 '$branch' 的定时任务已存在，跳过${NC}"
    else
        # 添加定时任务：每天指定时间自动下载并编译该分支
        # BL_CRON_MODE=1 用于标识是从 cron 调用，以便检查定时下载开关
        echo "0 $hour * * * BL_CRON_MODE=1 $BL_SCRIPT $branch >> $HOME/openharmony/cron_${branch}.log 2>&1" >> "$TEMP_CRON"
        echo -e "${GREEN}✓ 已添加分支 '$branch' 的定时任务 (每天 ${hour}:00)${NC}"
    fi
done

# 应用新的 crontab
crontab "$TEMP_CRON"
rm -f "$TEMP_CRON"

echo ""
echo -e "${GREEN}========================================${NC}"
echo -e "${GREEN}✓ 定时任务配置完成！${NC}"
echo -e "${GREEN}========================================${NC}"
echo ""
echo "定时任务详情:"
for i in "${!BRANCHES_TO_SETUP[@]}"; do
    branch="${BRANCHES_TO_SETUP[$i]}"
    hour="${CRON_TIMES[$i]}"
    echo "  • $branch: 每天 ${hour}:00 自动下载并编译"
    echo "    日志: $HOME/openharmony/cron_${branch}.log"
done
echo ""
echo "管理定时任务:"
echo "  查看: crontab -l"
echo "  编辑: crontab -e"
echo ""
echo "管理分支:"
echo "  bl branch list      # 查看所有分支"
echo "  bl branch add       # 添加新分支"
echo "  bl branch config    # 配置分支参数"

echo ""

# 检查是否需要配置认证信息
if grep -q "your_username_here" "$REPO_ENV_FILE" 2>/dev/null || grep -q "your_password_here" "$REPO_ENV_FILE" 2>/dev/null; then
    echo -e "${YELLOW}========================================${NC}"
    echo -e "${YELLOW}⚠ 重要提示${NC}"
    echo -e "${YELLOW}========================================${NC}"
    echo ""
    echo -e "${RED}请配置 Repo 认证信息，否则 repo sync 可能失败！${NC}"
    echo ""
    echo -e "${BLUE}编辑配置文件:${NC}"
    echo "  nano $REPO_ENV_FILE"
    echo ""
    echo -e "${BLUE}需要填写:${NC}"
    echo "  export ONLINE_USERNAME='您的用户名'"
    echo "  export ONLINE_PASSWD='您的密码'"
    echo ""
    echo -e "${BLUE}验证配置:${NC}"
    echo "  BL_DEBUG=1 bl status"
    echo ""
fi

# 安装命令行补全
echo -e "${YELLOW}========================================${NC}"
echo -e "${YELLOW}安装命令行补全${NC}"
echo -e "${YELLOW}========================================${NC}"
echo ""

# 检测当前 shell 并安装对应的补全脚本
CURRENT_SHELL=$(basename "$SHELL")
COMPLETION_INSTALLED=false

# Bash 补全
if [ -f "$SCRIPT_DIR/bl-completion.bash" ]; then
    BASH_COMPLETION_DIR="$HOME/.local/share/bash-completion/completions"
    mkdir -p "$BASH_COMPLETION_DIR"
    cp "$SCRIPT_DIR/bl-completion.bash" "$BASH_COMPLETION_DIR/bl"
    echo -e "${GREEN}✓ Bash 补全已安装到: $BASH_COMPLETION_DIR/bl${NC}"
    COMPLETION_INSTALLED=true

    # 检查是否需要在 .bashrc 中添加 source
    if ! grep -q "bash-completion" "$HOME/.bashrc" 2>/dev/null; then
        echo ""
        echo -e "${YELLOW}提示: 如果补全不生效，请在 ~/.bashrc 中添加:${NC}"
        echo "  source $BASH_COMPLETION_DIR/bl"
    fi
fi

# Zsh 补全
if [ -f "$SCRIPT_DIR/_bl" ]; then
    ZSH_COMPLETION_DIR="$HOME/.zsh/completions"
    mkdir -p "$ZSH_COMPLETION_DIR"
    cp "$SCRIPT_DIR/_bl" "$ZSH_COMPLETION_DIR/_bl"
    echo -e "${GREEN}✓ Zsh 补全已安装到: $ZSH_COMPLETION_DIR/_bl${NC}"
    COMPLETION_INSTALLED=true

    # 检查是否需要配置 fpath
    if [ -f "$HOME/.zshrc" ] && ! grep -q "$ZSH_COMPLETION_DIR" "$HOME/.zshrc" 2>/dev/null; then
        echo ""
        echo -e "${YELLOW}提示: 如果补全不生效，请在 ~/.zshrc 中添加:${NC}"
        echo "  fpath=(~/.zsh/completions \$fpath)"
        echo "  autoload -Uz compinit && compinit"
    fi
fi

if [ "$COMPLETION_INSTALLED" = false ]; then
    echo -e "${YELLOW}⚠ 未找到补全脚本文件${NC}"
fi

echo ""
echo -e "${GREEN}========================================${NC}"
echo -e "${GREEN}✓ 安装全部完成！${NC}"
echo -e "${GREEN}========================================${NC}"
echo ""
